home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 13 / AMIGAplus Sonderheft 13 (1998)(ICP)(DE)[!].iso / rexx / aspell.bed < prev    next >
Text File  |  1997-12-03  |  18KB  |  555 lines

  1. /**************************************************************************/
  2. /* $VER: ASpell.bed 2.2 (08 May 1996)                                     */
  3. /* The AlphaSpell GUI ) Copyright Fergus Duniho 1995-6                    */
  4. /**************************************************************************/
  5.  
  6. OPTIONS RESULTS
  7. OPTIONS FAILAT 20
  8. SIGNAL ON SYNTAX
  9. SIGNAL ON FAILURE
  10.  
  11. CALL OpenLib("rexxsupport.library")
  12. CALL OpenLib("rexxtricks.library")
  13. IF REXXTRICKSVERSION() < "38.6" THEN EXIT
  14.  
  15. GUI = "AlphaSpell:ASpell.gui"
  16. PSC = GetScreen()
  17. EditPort = GetEditPort()
  18.  
  19. tempfile = "T:Temp" || TIME(s)
  20. win.title = "Select a Word:"
  21. win.gadgettext = "_Accept|_Cancel"
  22. win.pubscreen = PSC
  23. win.width = 40
  24. win.sort = "FALSE"
  25. win.multiselect = "FALSE"
  26.  
  27. CALL Spellcheck()
  28. CALL Cleanup()
  29. EXIT
  30.  
  31. /**************************************************************************/
  32. /* SetUp() -- Opens command hosts, etc.                                   */
  33. /**************************************************************************/
  34.  
  35. SpellCheck:
  36.  
  37. /**************************************************************************/
  38. /* Launch AlphaSpell                                                      */
  39. /**************************************************************************/
  40.  
  41. IF Show("P", "ALPHASPELL") ~= 1 THEN DO
  42.     ADDRESS COMMAND "run >NIL: AlphaSpell:AlphaSpell AREXX"
  43.     ADDRESS COMMAND "WaitForPort ALPHASPELL"
  44.     shutdown = 1
  45. END
  46. ELSE shutdown = 0
  47.  
  48. IF SHOW("P", "ALPHASPELL") = 0 THEN RETURN
  49.  
  50. /**************************************************************************/
  51. /* Launch Varexx                                                          */
  52. /**************************************************************************/
  53.  
  54. /* Check Varexx is loaded if not load it */
  55.  
  56. IF SHOW("P","VAREXX") ~= 1 THEN DO
  57.     ADDRESS COMMAND "run >NIL: varexx"
  58.     ADDRESS COMMAND "WaitForPort VAREXX"
  59. END
  60. ADDRESS VAREXX
  61.  
  62. IF OPENPORT("HOLLY") = 0 THEN DO
  63.     ADDRESS ALPHASPELL ANNOUNCE "Could not open Varexx"
  64.     RETURN
  65. END
  66. version
  67. IF RESULT < 1.6 THEN DO
  68.     ADDRESS ALPHASPELL ANNOUNCE "You need version 1.6+ of Varexx"
  69.     RETURN
  70. END
  71. "load" GUI "HOLLY PS" PSC
  72. vhost = RESULT
  73. ADDRESS VALUE vhost
  74.  
  75. IF EditPort ~= "" THEN ADDRESS VALUE EditPort
  76. ADDRESS
  77.  
  78. /**************************************************************************/
  79. /* Localize gadget text for chosen language                               */
  80. /**************************************************************************/
  81.  
  82. lang = GetENV("language")
  83. IF lang ~= "" & lang ~= "english" THEN DO
  84.     catalog = "AlphaSpell:Catalogs/ASpell." || lang
  85.     IF Exists(catalog) THEN DO
  86.         CALL READFILE catalog, lines
  87.         DO x = 1 to lines.0
  88.             INTERPRET "setlabel" "'"lines.x"'"
  89.         END
  90.     END
  91. END
  92.  
  93. /**************************************************************************/
  94. /* Show About screen while AlphaSpell checks document.                    */
  95. /**************************************************************************/
  96.  
  97. show about
  98.  
  99. ADDRESS ALPHASPELL WHO
  100. name = RESULT
  101. IF name ~= "" THEN settext share name
  102. CALL ReadPrefs()
  103. CALL SaveTemp()
  104.  
  105. /**************************************************************************/
  106. /* Spell check tempfile with AlphaSpell                                   */
  107. /**************************************************************************/
  108.  
  109. ADDRESS ALPHASPELL "CHECK" tempfile tempfile "PATH" dict_path dict_list
  110.  
  111. /**************************************************************************/
  112. /* Set Lists                                                              */
  113. /**************************************************************************/
  114.  
  115. CALL ReadList "UNFOUND"
  116. IF UNFOUND.0 = 0 THEN DO
  117.     ADDRESS ALPHASPELL ANNOUNCE "Spell Checking Finished:\n\nNo Misspellings Found\n"
  118.     RETURN
  119. END
  120. current = 1
  121. LWORDS.0 = 0
  122. MWORDS.0 = 0
  123.  
  124. hide
  125. show main
  126. IF name = "" THEN setbar ed max 2
  127. window front activate
  128. CALL SetTarget UNFOUND.1
  129.  
  130. /**************************************************************************/
  131. /* MAIN LOOP -- Check for GUI events                                      */
  132. /**************************************************************************/
  133.  
  134. DO FOREVER
  135.     CALL WAITPKT("HOLLY")
  136.     packet = GETPKT("HOLLY")
  137.     IF packet ~= '00000000'x THEN DO
  138.         class = GETARG(packet)
  139.         SELECT
  140.             WHEN class = "CLOSEWINDOW" THEN LEAVE
  141.             WHEN class = "LEARN" THEN CALL Learn()
  142.             WHEN class = "FIND" THEN flag = FindWord(flag)
  143.             WHEN class = "REPLACE" THEN CALL ReplaceWord()
  144.             WHEN class = "GUESS" THEN CALL Guess()
  145.             WHEN class = "NEXT" THEN CALL SetTarget("+1")
  146.             WHEN class = "PREV" THEN CALL SetTarget("-1")
  147.             WHEN class = "FIRST" THEN CALL SetTarget(1)
  148.             WHEN class = "LAST" THEN CALL SetTarget(UNFOUND.0)
  149.             WHEN class = "SELECT" THEN CALL ChooseWord()
  150.             WHEN Word(class, 1) = "METHOD" THEN DO
  151.                 IF Word(class, 2) = "0" THEN set ed enable
  152.                 ELSE set ed disable
  153.             END
  154.             WHEN class = "PREFS" THEN DO
  155.                 CALL Preferences()
  156.                 CALL SetTarget(current)
  157.                 IF name = "" THEN setbar ed max 2
  158.             END
  159.             OTHERWISE NOP
  160.         END
  161.         window front activate
  162.     END
  163. END
  164. IF LWORDS.0 + MWORDS.0 > 0 THEN DO
  165.     hide
  166.     show learn
  167.     CALL QSORT "LWORDS"
  168.     LWORDS.count = LWORDS.0
  169.     setlist lwords clear stem LWORDS select LWORDS.1
  170.     CALL QSORT "MWORDS"
  171.     MWORDS.count = MWORDS.0
  172.     setlist mwords clear stem MWORDS select MWORDS.1
  173.     DO FOREVER
  174.         CALL WAITPKT("HOLLY")
  175.         packet = GETPKT("HOLLY")
  176.         IF packet ~= '00000000'x THEN DO
  177.             class = GETARG(packet)
  178.             SELECT
  179.                 WHEN class = "CLOSEWINDOW" THEN LEAVE
  180.                 WHEN class = "SAVEWORDS" THEN DO
  181.                     CALL SaveList()
  182.                     LEAVE
  183.                 END
  184.                 WHEN class = "MOVE" THEN CALL Move()
  185.                 WHEN class = "RML" THEN CALL Lose("lwords")
  186.                 WHEN class = "RMM" THEN CALL Lose("mwords")
  187.                 OTHERWISE NOP
  188.             END
  189.             window front activate
  190.         END
  191.     END
  192. END
  193. ADDRESS
  194. RETURN
  195.  
  196. /**************************************************************************/
  197. /* VARIOUS SUBROUTINES                                                    */
  198. /**************************************************************************/
  199.  
  200. /**************************************************************************/
  201. /* SetTarget(word) -- Sets the word in the target string gadget           */
  202. /**************************************************************************/
  203.  
  204. SetTarget:
  205. IF DATATYPE(arg(1)) = "NUM" THEN DO
  206.     IF VERIFY(arg(1), "+-", "M") = 1 THEN current = current + arg(1)
  207.     ELSE current = arg(1)
  208.     IF current < 1 THEN current = UNFOUND.0
  209.     IF current > UNFOUND.0 THEN current = 1
  210.     settext target UNFOUND.current
  211.     settext replacement UNFOUND.current
  212. END
  213. ELSE DO
  214.     settext target arg(1)
  215.     settext replacement arg(1)
  216. END
  217. flag = 0 /* Word hasn't been searched for since selection */
  218. RETURN
  219.  
  220. /**************************************************************************/
  221. /* SetReplace() - Sets replacement string gadget                          */
  222. /**************************************************************************/
  223.  
  224. SetReplace:
  225. settext replacement arg(1)
  226. settext target UNFOUND.current
  227. RETURN
  228.  
  229. /**************************************************************************/
  230. /* Learn() -- Adds a word to LEARN, the words to learn list               */
  231. /**************************************************************************/
  232.  
  233. Learn:
  234. read target
  235. wrd = RESULT
  236. /* Tests whether wrd is lowercase */
  237. IF BITOR(wrd,," ") == wrd THEN DO
  238.     IF LSEARCH(wrd, "LWORDS") == -1 THEN DO
  239.         cnt = LWORDS.0 + 1
  240.         LWORDS.0 = cnt
  241.         LWORDS.cnt = wrd
  242.     END
  243. END
  244. ELSE DO
  245.     cur = LSEARCH(wrd, "MWORDS")
  246.     DO WHILE (MWORDS.cur = wrd) & (MWORDS.cur ~== wrd)
  247.         cur = cur + 1
  248.     END
  249.     IF cur == -1 THEN DO
  250.         cnt = MWORDS.0 + 1
  251.         MWORDS.0 = cnt
  252.         MWORDS.cnt = wrd
  253.     END
  254. END
  255. CALL SetTarget("+1")
  256. RETURN
  257.  
  258. /**************************************************************************/
  259. /* Guess() has AlphaSpell search for anagrams, matches, or guesses        */
  260. /**************************************************************************/
  261.  
  262. Guess:
  263. busy set
  264. read method
  265. mode = RESULT
  266. read replacement
  267. targ = RESULT
  268. SELECT
  269.     WHEN mode = 0 THEN DO
  270.         read ed
  271.         op = "ED" RESULT
  272.     END
  273.     WHEN mode = 2 THEN op = "ANAGRAMS"
  274.     WHEN mode = 3 THEN op = "CASE"
  275.     OTHERWISE op = ""
  276. END
  277.  
  278. ADDRESS ALPHASPELL "MATCH" targ op "TO" tempfile "PATH" dict_path dict_list
  279. CALL ReadList "GUESS"
  280. busy
  281. IF GUESS.0 > 0 THEN DO
  282.     IF VIEWLIST("GUESS", "win", "dest") = 1 THEN CALL SetReplace(dest.1)
  283. END
  284. ELSE ADDRESS ALPHASPELL ANNOUNCE "Search Complete:\n\nNo Match Found\n"
  285. RETURN
  286.  
  287. /**************************************************************************/
  288. /* ChooseWord() -- Select word from listview of unfound words             */
  289. /**************************************************************************/
  290.  
  291. ChooseWord:
  292. IF VIEWLIST("UNFOUND", "win", "dest") = 1 THEN CALL SetTarget(dest.1)
  293. IF dest.1 ~= "" THEN DO
  294.     current = LSEARCH(dest.1, "UNFOUND")
  295.     uwrd = UPPER(dest.1)
  296.     DO WHILE (UPPER(UNFOUND.current) = uwrd) & (UNFOUND.current ~= dest.1)
  297.         current = current + 1
  298.     END
  299. END
  300. RETURN
  301.  
  302. /**************************************************************************/
  303. /* SaveList() -- Saves words in the "LEARN" list to user dictionary       */
  304. /**************************************************************************/
  305.  
  306. SaveList:
  307. udict.low = MAKEPATH(dict_path, user_dict || ".ald")
  308. udict.mix = MAKEPATH(dict_path, user_dict || ".amd")
  309. read lwords LEARN
  310. LEARN.0 = LEARN.count
  311. IF LEARN.0 > 0 THEN DO
  312.     CALL WRITEFILE tempfile, "LEARN"
  313.     ADDRESS ALPHASPELL "ADD FROM" tempfile "TO" udict.low
  314. END
  315. read mwords LEARN
  316. LEARN.0 = LEARN.count
  317. IF LEARN.0 > 0 THEN DO
  318.     CALL WRITEFILE tempfile, "LEARN"
  319.     ADDRESS ALPHASPELL "ADD FROM" tempfile "TO" udict.mix
  320. END
  321. CALL DELETE tempfile
  322. RETURN
  323.  
  324. /**************************************************************************/
  325. /* Move() -- Moves word from mixed case listview to lowercase listview    */
  326. /**************************************************************************/
  327.  
  328. Move:
  329. setlist lwords BITOR(Lose("mwords"),," ")
  330. RETURN
  331.  
  332. /**************************************************************************/
  333. /* ReadList -- Reads words from tempfile to a list and sorts the list     */
  334. /**************************************************************************/
  335.  
  336. ReadList:
  337. CALL READFILE tempfile, arg(1)
  338. INTERPRET arg(1) || ".count =" arg(1) || ".0"
  339. CALL QSORT arg(1)
  340. RETURN
  341.  
  342. /**************************************************************************/
  343. /* Lose() -- Deletes a word from a listview                               */
  344. /**************************************************************************/
  345.  
  346. Lose:
  347. INTERPRET "read" arg(1) boo
  348. wrd = RESULT
  349. INTERPRET "setlist" arg(1) "wrd del"
  350. item = boo.select
  351. IF item = boo.count THEN item = item - 1
  352. INTERPRET "setlist" arg(1) "select s update" item
  353. RETURN wrd
  354.  
  355. /**************************************************************************/
  356. /* Preferences() -- Preferences GUI                                       */
  357. /**************************************************************************/
  358.  
  359. Preferences:
  360.  
  361. hide
  362. show prefs
  363. IF ~GetDir("AlphaSpell:Dict/", "#?", "langs", "D", "N") THEN RETURN
  364. CALL QSORT "langs"
  365. langs.count = langs.0
  366. setlist language clear stem langs
  367. IF LSEARCH(lang, langs) = -1 THEN setlist language langs.1
  368. ELSE setlist language select lang
  369. settext dict dict_list
  370. settext udict user_dict
  371. DO FOREVER
  372.     CALL WAITPKT("HOLLY")
  373.     packet = GETPKT("HOLLY")
  374.     IF packet ~= '00000000'x THEN DO
  375.         class = GETARG(packet)
  376.         SELECT
  377.             WHEN class = "CLOSEWINDOW" | class = "CANCEL" THEN LEAVE
  378.             WHEN class = "SAVE" | class = "USE" THEN DO
  379.                 read language
  380.                 lang = RESULT
  381.                 dict_path = "AlphaSpell:Dict/" || lang || "/"
  382.                 read dict
  383.                 dict_list = RESULT
  384.                 read udict
  385.                 user_dict = RESULT
  386.                 IF class = "SAVE" THEN CALL WritePrefs
  387.                 LEAVE
  388.             END
  389.             OTHERWISE NOP
  390.         END
  391.     END
  392. END
  393. hide
  394. show main
  395. RETURN
  396.  
  397. /**************************************************************************/
  398. /* WritePrefs() -- Writes Preferences to Icon                             */
  399. /**************************************************************************/
  400.  
  401. WritePrefs:
  402. CALL SETTOOLTYPEVALUE GUI, "LANG", lang
  403. CALL SETTOOLTYPEVALUE GUI, "DICT", dict_list
  404. CALL SETTOOLTYPEVALUE GUI, "USER", user_dict
  405. RETURN
  406.  
  407. /**************************************************************************/
  408. /* ReadPrefs() -- Read Preferences from ENV:ASpell.prefs or use defaults  */
  409. /**************************************************************************/
  410.  
  411. ReadPrefs:
  412. lang = GETTOOLTYPEVALUE(GUI, "LANG")
  413. dict_path = "AlphaSpell:Dict/" || lang || "/"
  414. dict_list = GETTOOLTYPEVALUE(GUI, "DICT")
  415. user_dict = GETTOOLTYPEVALUE(GUI, "USER")
  416. IF ~Exists(dict_path) THEN DO
  417.     ADDRESS ALPHASPELL ANNOUNCE dict_path "doesn't exist."
  418.     CALL Preferences()
  419.     show about
  420. END
  421. RETURN
  422.  
  423. /**************************************************************************/
  424. /* Cleanup() -- Closes down the GUI                                       */
  425. /**************************************************************************/
  426.  
  427. Cleanup:
  428. IF SHOWLIST("P", "HOLLY") = 1 THEN CALL CLOSEPORT ("HOLLY")
  429. IF SHOWLIST("P", "VAREXX") = 1 THEN ADDRESS "VAREXX" hide unload
  430. IF SHOWLIST("P", "ALPHASPELL") = 1 & shutdown = 1 THEN ADDRESS ALPHASPELL QUIT
  431. RETURN
  432.  
  433. /**************************************************************************/
  434. /* OpenLib(library) -- Checks that library exists and opens it if it does */
  435. /**************************************************************************/
  436.  
  437. OpenLib: PROCEDURE
  438.  
  439. IF EXISTS("libs:" || arg(1)) THEN DO
  440.     IF ~SHOW("L", arg(1)) THEN
  441.         IF ~ADDLIB(arg(1),0,-30,0) THEN EXIT
  442. END
  443. ELSE EXIT
  444. RETURN
  445.  
  446. /**************************************************************************/
  447. /* ERROR MESSAGES                                                         */
  448. /**************************************************************************/
  449.  
  450. failure:
  451. syntax:
  452. SAY "Error" rc  "-- Line" SIGL
  453. SAY errortext(rc)
  454. SAY sourceline(SIGL)
  455. CALL Cleanup()
  456. EXIT
  457.  
  458. /**************************************************************************/
  459. /* Functions to get around the limits of some text editors. You might or  */
  460. /* might not need some of these.                                          */
  461. /**************************************************************************/
  462.  
  463. /**************************************************************************/
  464. /* WordComp(string, word) -- Checks whether a target word can be parsed   */
  465. /* from a given string. This is useful if your text editor lacks a whole  */
  466. /* word search mode. You can search for a word, read the full text of the */
  467. /* found string, and compare them.                                        */
  468. /**************************************************************************/
  469.  
  470. WordComp: PROCEDURE
  471. Parse Arg str, wrd, x
  472. s = Index(str, wrd, x)
  473. IF s = 0 THEN RETURN 0
  474. IF s>1 THEN DO
  475.     c = Substr(str, s-1, 1)
  476.     IF Datatype(c, "A") = 1 | c = "'" THEN RETURN 0
  477. END
  478. s = s + Length(wrd)
  479. IF s > Length(str) THEN RETURN 1
  480. c = Substr(str, s, 1)
  481. IF Datatype(c, "M") = 1 THEN RETURN 0
  482. RETURN 1
  483. END
  484.  
  485. /**************************************************************************/
  486. /* EDITOR SPECIFIC SUBROUTINES                                            */
  487. /**************************************************************************/
  488.  
  489. /**************************************************************************/
  490. /* FindWord() -- Finds selected word in document                          */
  491. /**************************************************************************/
  492.  
  493. FindWord:
  494. read target
  495. wrd = RESULT /* Reads selected word */
  496. ADDRESS
  497. IF arg(1) = 0 THEN MoveSOF
  498. GetCursorPos
  499. oldpos = RESULT
  500.  
  501. GetPrefs FindWholeWord
  502. wholeword = RESULT
  503. SetPrefs FindWholeWord ON
  504. Find wrd
  505. SetPrefs FindWholeWord wholeword
  506.  
  507. ADDRESS
  508. RETURN 1
  509.  
  510. /**************************************************************************/
  511. /* ReplaceWord() -- Replaces selected word with word in string gadget     */
  512. /**************************************************************************/
  513.  
  514. ReplaceWord: PROCEDURE
  515. read replacement
  516. newword = RESULT
  517. ADDRESS
  518. FindChange newword
  519. ADDRESS
  520. RETURN
  521.  
  522. /**************************************************************************/
  523. /* SaveTemp() -- Saves the current file as a temporary file               */
  524. /**************************************************************************/
  525.  
  526. SaveTemp:
  527. ADDRESS
  528. GetFilePath PATH FILE
  529. name = RESULT
  530. SaveFileAs QUIET NOBACKUP NOICON tempfile
  531. SetFilePath name
  532. ADDRESS
  533. RETURN
  534.  
  535. /**************************************************************************/
  536. /* GetEditPort() -- Makes sure the right text editor port is open.        */
  537. /**************************************************************************/
  538.  
  539. GetEditPort:
  540. IF Abbrev(Address(), "BED_") = 0 THEN DO
  541.     Say "Execute this script from BED"
  542.     EXIT
  543. END
  544.  
  545. RETURN Address()
  546.  
  547. /**************************************************************************/
  548. /* GetScreen() -- Returns the screen name                                 */
  549. /**************************************************************************/
  550.  
  551. GetScreen: PROCEDURE
  552. "GetScreenInfo"
  553. PARSE VAR RESULT . . . . . . . '"'screen'"'
  554. RETURN screen
  555.